﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using DataAccess;
using DevExpress.XtraEditors;
using NLog;
using QuanLyKhachSan.TemplateReport;

namespace QuanLyKhachSan
{
    public partial class TabHoaDonDichVu : XtraUserControl,IGeneatetabName
    {
        private readonly HoaDonDichVuManager _hdManager = new HoaDonDichVuManager();
        private  static Logger log = LogManager.GetCurrentClassLogger();

        public TabHoaDonDichVu()
        {
            InitializeComponent();
        }

        public string Getname()
        {
            return "Hóa Đơn Dịch Vụ";
        }

        private static void Logs(ActionResult listResult)
        {
            foreach (var ex in listResult.Exceptions)
            {
                log.Error(ex.Message);
            }
        }

        public  void LoadDb()
        {
            try
            {
                var acResult = _hdManager.GetListOrderServices();
                if (acResult.Sucess())
                    gridControlCustomers.DataSource = acResult.Result;
                else
                    Logs(acResult);
            }
            catch (Exception ex)
            {
                log.Error(ex);
            }
        }

        private void Them_Click()
        {
            log.Info(Commons.ToString()+ " chọn chức năng cập nhật hóa đơn dịch vụ");
            var frm = new FormHoaDonDichVuCapNhat();
            if (frm.ShowDialog() == DialogResult.OK)
            {
                RefreshGridView();
                XtraMessageBox.Show("Thêm hóa đơn thành công");
            }
                
        }

        private bool KiemTraRangBuoc(int maHd)
        {
            try
            {
                var checkOrderDetails = new ChiTietHoaDonDVManager().Find(order => order.MaHoaDonDV.Equals(maHd)).Result.FirstOrDefault<ChiTietHoaDonDichVu>();
                return checkOrderDetails == null;
            }
            catch (Exception)
            {
                return false;
            }
        }

        private void Xoa_Click()
        {
            log.Info(Commons.ToString() + " chọn chức năng xóa hóa đơn dịch vụ");
            var confirm = XtraMessageBox.Show("Bạn có chắc chắn xóa không", "Xác nhận", MessageBoxButtons.YesNo,
                 MessageBoxIcon.Question);
            if (confirm == DialogResult.Yes)
            {
                foreach (var selectedRow in gridView1.GetSelectedRows())
                {
                    try
                    {
                        var rowDel = gridView1.GetRow(selectedRow) as HoaDonDichVu;
                        if (rowDel != null)
                        {
                            if (KiemTraRangBuoc(rowDel.MaHoaDonDV))
                            {
                                _hdManager.Delete(rowDel);
                            }
                            else
                            {
                                DialogResult dl = XtraMessageBox.Show("Bị ràng buộc chi tiết hóa đơn, Bạn có muốn xóa luôn chi tiết hóa đơn ?", "Ràng buộc khóa ngoại", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                                if (dl == DialogResult.Yes)
                                    _hdManager.XoaKhiRangBuoc(rowDel.MaHoaDonDV);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        log.Info(ex);
                    }
                }
                LoadDb();
            }
        }

        private void btnThem_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            Them_Click();
        }

        private void btnXoa_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            Xoa_Click();
        }

        private void RefreshGridView()
        {
            try
            {
                var acResult = _hdManager.GetListOrderServices();
                if (acResult.Sucess())
                    gridControlCustomers.DataSource = acResult.Result;
                int rowHandle = gridView1.FocusedRowHandle;
                gridView1.RefreshRow(rowHandle);}
            catch (Exception ex)
            {
                log.Error(ex);
            }
        }

        private void CapNhat_Click()
        {
            log.Info(Commons.ToString() + " chọn chức năng cập nhật hóa đơn dịch vụ");
            var hoaDonDv = GetRowSelected();
            if (hoaDonDv != null)
            {
                var frm = new FormHoaDonDichVuCapNhat(hoaDonDv) {btnThaoTac = {Text = "Update"}};
                if (frm.ShowDialog()==DialogResult.OK)
                {
                    XtraMessageBox.Show("Cập nhật thành công");
                    RefreshGridView();
               }
            }
            else
            {
                XtraMessageBox.Show("Bạn phải chọn 1 dịch vụ để cập nhật.", "thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void Tim_Click()
        {
            log.Info(Commons.ToString() +  " chọn chức năng cập tìm kiếm hóa đơn dịch vụ");
            var frmTimHoaDon = new FormTimHoaDon();
            if (frmTimHoaDon.ShowDialog() == DialogResult.OK)
            {
                XtraMessageBox.Show("Kết quả tìm thấy là: " + frmTimHoaDon.Result.Count());
                gridControlCustomers.DataSource = frmTimHoaDon.Result;
            }
        }

        private void ExportToFile()
        {
            var xtraReportHoaDonDv = new XtrpHoaDonDV();
            log.Info("Chọn chức năng in danh sách hóa đơn dịch vụ");
            try
            {
                var frmReport = new FormReport(xtraReportHoaDonDv);
                frmReport.ShowDialog();
            }
            catch (Exception)
            {
                XtraMessageBox.Show("Vui lòng đảm bảo tồn tại dữ liệu trước khi xuất");
            }
        }
        
        private HoaDonDichVu GetRowSelected()
        {
            try
            {
                int rowSelected = gridView1.GetSelectedRows()[0];
                return gridView1.GetRow(rowSelected) as HoaDonDichVu;
            }
            catch (Exception)
            {
                return null;
            }
        }

   
        
        private void TabHoaDonDichVu_Load(object sender, EventArgs e)
        {
            LoadDb();
        }

        private void gridView1_RowUpdated(object sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e)
        {
            var hoaDon = GetRowSelected();
            var rs = _hdManager.InsertOrUpdate(hoaDon);
            if (hoaDon != null)
            {
                XtraMessageBox.Show(rs.Sucess() ? "Cập nhật thành công" : rs.GetErrorMessage());
            }
        }

        private void xemChiTiếtHóaĐơnToolStripMenuItem_Click(object sender, EventArgs e){
            var rowSelected = GetRowSelected();
            log.Info("Chọn chức năng xem chi tiết hóa đơn dịch vụ");
            if (rowSelected != null)
            {
                var listChiTiet = new ChiTietHoaDonDVManager().Find(ct => ct.MaHoaDonDV.Equals(rowSelected.MaHoaDonDV));
                var frmCt = new FormInChiTietHoaDonTheoKH(listChiTiet.Result);
                frmCt.ShowDialog();
            }
            else
            {
                XtraMessageBox.Show("Vui lòng chọn hóa đơn cần xem chi tiết", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void InChiTiet_Click()
        {
            var rowSelected = GetRowSelected();
            if (rowSelected != null)
            {
                List<ChiTietHoaDonDichVu> rs =
                    new ChiTietHoaDonDVManager().Find(ct => ct.MaHoaDonDV.Equals(rowSelected.MaHoaDonDV)).Result;
                var phieuThu = new XtrpPhieuThuDV(rs);

                var frm = new FormReport(phieuThu);
                frm.ShowDialog();
            }
        }

        private void btnInChiTiet_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            InChiTiet_Click();
        }

        private void barExport_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ExportToFile();
        }

        private void barThem_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Them_Click();
        }

        private void barXoa_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Xoa_Click();
        }

        private void barSua_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            CapNhat_Click();
        }

        private void barTimKiem_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            gridView1.OptionsFind.AlwaysVisible = !gridView1.OptionsFind.AlwaysVisible;
        }

        private void btnCapNhat_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            CapNhat_Click();
        }

        private void btnTimKiem_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            Tim_Click();
        }

        private void barRefresh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            LoadDb();
        }

        private void mnInchiTiet_Click(object sender, EventArgs e)
        {
            InChiTiet_Click();
        }

        private void mnThem_Click(object sender, EventArgs e)
        {
            Them_Click();
        }

        private void mnXoa_Click(object sender, EventArgs e)
        {
            Xoa_Click();
        }

        private void mnCapNhat_Click(object sender, EventArgs e)
        {
            CapNhat_Click();
        }

        private void mntim_Click(object sender, EventArgs e)
        {
            Tim_Click();
        }

        private void mnInDanhSach_Click(object sender, EventArgs e)
        {
            ExportToFile();
        }
    }
}
